﻿using Ext.Net;
using Ext.Net.MVC;
using Newtonsoft.Json;
using PcaCaja.BOL;
using PcaCaja.DAL;
using PcaCore.BOL.Tablas;
using PcaCore.DAL;
using PcaCore.DAL.Log;
using PcaCore.DAL.Tablas;
using PcaParqueos.BOL;
using PcaParqueos.DAL;
using PcaSocios.BOL;
using PcaSocios.DAL;
using PcaWeb.Areas.Parqueos.Models;
using PcaWeb.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace PcaWeb.Areas.Parqueos.Controllers
{
    public class RegistroActivoController : ControllerUser
    {
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult GetListActivos(string placa)
        {
            List<oVwRegistro> registros = dRegistro.GetListActivo(dSesion.GetEmpresaId(),
                                                                dSesion.GetOficinaId(),
                                                                placa);

            return this.Store(registros, registros.Count );
        }

        public ActionResult FrmRegistrar()
        {
            return new Ext.Net.MVC.PartialViewResult
            {
                ViewName = "FrmRegistrar"
            };
        }

        [HttpPost]
        public ActionResult Registrar(int? tipoVehiculoId, string placa)
        {
            try
            {
                dRegistro.Insert(dSesion.GetEmpresaId(),
                                 dSesion.GetOficinaId(),
                                 dSesion.GetUsuarioId(),  
                                 Convert.ToInt32(tipoVehiculoId),
                                 placa.Trim().ToUpper(),
                                 dSesion.GetId(),
                                 DateTime.Now);
                return Json(new { success = true });
            }
            catch (Exception ex)
            {
                return Json(new { success = false, msg = ex.Message });
            }
        }

        [HttpPost]
        public ActionResult EmitirComprobante(long? registro_id, 
                                              long? liquidacion_id,
                                              long? clienteId,
                                              int? horas_contabilizadas,
                                              string moneda_id, 
                                              decimal? precio_venta,
                                              decimal? efectivo_percibido)
        {
            try
            {
                oVwRegistro registro = dRegistro.Get(dSesion.GetEmpresaId(),
                                                  dSesion.GetOficinaId(),
                                                  Convert.ToInt64(registro_id));

                if (registro == null)
                    return Json(new { success = false, msg = "El registro ya no existe en la base de datos, posiblemente fue eliminado por otro usuario" });

                dRegistro.EmitirComprobante(dSesion.GetEmpresaId(),
                                            dSesion.GetOficinaId(),
                                            Convert.ToInt64(registro_id),
                                            Convert.ToInt64(liquidacion_id),
                                            dSesion.GetUsuarioId(),
                                            Convert.ToInt64(clienteId),
                                            dSesion.GetId(),
                                            Convert.ToInt32(horas_contabilizadas),
                                            (registro.es_abonado) ? "00" : "12",
                                            moneda_id,
                                            Convert.ToDecimal(precio_venta),
                                            Convert.ToDecimal(efectivo_percibido));

                if (!registro.es_abonado)
                {
                    try
                    {
                        TicketPublicoGeneral ticket = new TicketPublicoGeneral(registro.registro_id);
                        string dataEncode = Core.Base64Encode(JsonConvert.SerializeObject(ticket.GetLinesPrint));
                        return Json(new { success = true, printTicket = true, data = dataEncode, proxyUrl = ticket.GetPrinterProxy, puerto = ticket.GetPrinterPort });
                    }
                    catch { }
                }

                return Json(new { success = true, printTicket = false });
            }
            catch (Exception ex)
            {
                return Json(new { success = false, msg = ex.Message });
            }
        }

        private ActionResult FrmComprobante(oVwRegistro registro)
        {
            try
            {
                List<oLiquidacion> liquidaciones = PcaCaja.DAL.dLiquidacion.GetListActivo(dSesion.GetEmpresaId(), dSesion.GetOficinaId(), dSesion.GetUsuarioId());
                if (liquidaciones.Count == 0)
                    throw new Exception("No existe una liquidacion abierta para su usuario-terminal");
                
                //Calculamos el total de horas trascurridas
                TimeSpan tiempoTranscurrido = DateTime.Now.Subtract(registro.fecha_hora_ingreso);
                int horas = (int)(tiempoTranscurrido.TotalHours);

                //Aqui usamos un minuto y 59 segundos
                if (tiempoTranscurrido.TotalHours - horas > 0)
                    horas++;

                registro.horas_contabilizadas = horas;

                //Si es abonado consultamos su informacion
                if (registro.es_abonado)
                {
                    oVwCliente cliente = dAbonado.Get(dSesion.GetEmpresaId(),
                                                                   dSesion.GetOficinaId(),
                                                                   registro.vehiculo_id);
                    ViewBag.abonadoId = cliente.cliente_id;
                    ViewBag.nombreAbonado = cliente.nombre;

                    ViewBag.tarifaHora = 0;
                    registro.moneda_id = dTConfiguracion.GetIdMonedaPordefecto();
                    registro.precio_venta = 0;

                    return new Ext.Net.MVC.PartialViewResult
                    {
                        ViewName = "FrmSalidaAbonado",
                        Model = registro,
                        ViewData = ViewData
                    };
                }
                else
                {
                    oVwTarifaGeneral tarifaHora = dTarifaGeneral.Get(registro.empresa_id,
                                                                 registro.oficina_id,
                                                                 registro.tipo_vehiculo_id);
                    if (tarifaHora == null)
                        throw new Exception("Error al consultar tarifa general");

                    ViewBag.tarifaHora = tarifaHora.monto;

                    registro.siglas_moneda = tarifaHora.siglas_moneda;
                    registro.moneda_id = tarifaHora.moneda_id;
                    registro.precio_venta = tarifaHora.monto * horas;

                    return new Ext.Net.MVC.PartialViewResult
                    {
                        ViewName = "FrmComprobante",
                        Model = registro,
                        ViewData = ViewData
                    };
                }
            }
            catch (Exception ex)
            {
                return Json(new { success = false, msg = ex.Message });
            }
        }

        public ActionResult RunCommandGrid(string commandName, long? registroId)
        {
            oVwRegistro registro = dRegistro.Get(dSesion.GetEmpresaId(),
                                                  dSesion.GetOficinaId(),
                                                  Convert.ToInt64(registroId));

            if (registro == null)
                return Json(new { success = false, msg = "El registro ya no existe en la base de datos, posiblemente fue eliminado por otro usuario" });

            switch (commandName)
            {
                case "cmdEmitirComprobante":
                    if (registro.comprobante_id == 0)
                    {
                        return FrmComprobante(registro);
                    }
                    else
                    {
                        return Json(new { success = false, msg = String.Format("Ya existe un comprobante asignado al registro, actualice su ventana", commandName) });
                    }
                case "cmdEliminar":
                    return Json(new { success = false, msg = String.Format("\"{0}\" no esta implementado", commandName) });
                default:
                    return Json(new { success = false, msg = String.Format("\"{0}\" no es un comando valido", commandName) });
            }
        }
    }
}